#include <string>
#include <pthread.h>
#include <thread>
#include "Util.hpp"
#include "Config.hpp"
#include "Data.hpp"
#include "Hot.hpp"
#include "Server.hpp"

void Futiltest(const std::string &name)
{

    //     cloud::FileUtil Fu(name);
    //     std::cout << Fu.FileName() << std::endl;
    //     std::cout << Fu.FileSize() << std::endl;
    //     std::cout << Fu.FLastATime() << std::endl;
    //     std::cout << Fu.FLastMTime() << std::endl;

    // cloud::FileUtil Fu(name);
    // std::string body;
    // Fu.GetContent(&body); // 获取文件

    // cloud::FileUtil nfu("./test.txt");
    // nfu.SetContent(body); // 写入文件

    // std::string packname=name+".lz";
    // cloud::FileUtil Fu(name);
    // Fu.Compress(packname);

    // cloud::FileUtil pFu(packname);
    // pFu.UnCompress("./hello.txt");

    cloud::FileUtil Fu(name);
    Fu.CreateDirectory();
    std::vector<std::string> arry;
    Fu.ScanDirectory(&arry);
    for (auto &a : arry)
    {
        std::cout << a << std::endl;
    }
}
void JsonTest()
{
    const char *name = "yuyu";
    int age = 19;
    float score[] = {85, 85.5, 00};
    Json::Value root;
    root["姓名"] = name;
    root["年龄"] = age;
    root["成绩"].append(score[0]);
    root["成绩"].append(score[1]);
    root["成绩"].append(score[2]);
    std::string Json_str;
    cloud::JsonUtil::Serialize(root, &Json_str);
    std::cout << Json_str << std::endl;

    Json::Value val;
    cloud::JsonUtil::UnSerialize(Json_str, &val);
    std::cout << val["姓名"].asString() << std::endl;
    std::cout << val["年龄"].asInt() << std::endl;
    for (auto e : val["成绩"])
    {
        std::cout << e.asInt() << std::endl;
    }
}

void ConfigTest()
{
//     cloud::Config *con = cloud::Config::GetInstance();
//     std::cout << con->GetHotTime() << std::endl;
//     std::cout << con->GetServerPort() << std::endl;
//     std::cout << con->GetServerIp() << std::endl;
//     std::cout << con->GetDownloadPrefix() << std::endl;
//     std::cout << con->GetPackDir() << std::endl;
//     std::cout << con->GetBackDir() << std::endl;
//     std::cout << con->GetBackupFile() << std::endl;
//     std::cout << con->GetPackFileSuffix() << std::endl;
}

void DataTest(const std::string name)
{

//     cloud::BackupInfo info;
//     info.NewBackupInfo(name);

//     std::cout << "--------insert and getonebyurl----------\n";
//     cloud::DataManager data;
//     data.Insert(info);
//     cloud::BackupInfo tmp;
//     data.GetOneByURL("./download/bundle.h", &tmp);
//     std::cout << tmp.pack_flag << std::endl;
//     std::cout << tmp.fsize << std::endl;
//     std::cout << tmp.atime << std::endl;
//     std::cout << tmp.mtime << std::endl;
//     std::cout << tmp.pack_path << std::endl;
//     std::cout << tmp.real_path << std::endl;
//     std::cout << tmp.url << std::endl;

//     std::cout << "--------getall----------\n";
//     info.pack_flag = true;
//     data.Update(info);
//     std::vector<cloud::BackupInfo> arry;
//     data.GetAll(&arry);
//     for (auto &a : arry)
//     {
//         std::cout << tmp.pack_flag << std::endl;
//         std::cout << tmp.fsize << std::endl;
//         std::cout << tmp.atime << std::endl;
//         std::cout << tmp.mtime << std::endl;
//         std::cout << tmp.pack_path << std::endl;
//         std::cout << tmp.real_path << std::endl;
//         std::cout << tmp.url << std::endl;
//     }

//     std::cout << "--------getonebyrealpath----------\n";
//     data.GetOneByRealPath(name, &tmp);
//     std::cout << tmp.pack_flag << std::endl;
//     std::cout << tmp.fsize << std::endl;
//     std::cout << tmp.atime << std::endl;
//     std::cout << tmp.mtime << std::endl;
//     std::cout << tmp.pack_path << std::endl;
//     std::cout << tmp.real_path << std::endl;
//     std::cout << tmp.url << std::endl;

    cloud::DataManager data;
    std::vector<cloud::BackupInfo> arry;
    data.GetAll(&arry);
    for (auto &a : arry)
    {
        std::cout << a.pack_flag << std::endl;
        std::cout << a.fsize << std::endl;
        std::cout << a.pack_path << std::endl;
        std::cout << a.real_path << std::endl;
        std::cout << a.atime << std::endl;
        std::cout << a.mtime << std::endl;
        std::cout << a.url << std::endl;
    }
}

// int main(int argc, char *argv[])
// {
//     // _data = new cloud::DataManager();
//     // Futiltest(argv[1]);
//     // JsonTest();

//     DataTest(argv[1]);
//     // HotTest();
//     // ConfigTest();//配置文件
//     // std::cout<<"----------------server------------------";
//     // ServerTest();
//     // std::cout<<"----------------server------------------";

//     return 0;
// }

cloud::DataManager *_data;
void HotTest()
{
    cloud::HotManage hot;
    hot.RunMoudle();
}

void ServerTest()
{
    cloud::Server server;
    server.RunModule();
}

int main()
{
    _data = new cloud::DataManager();

    std::thread thread_server(ServerTest);
    std::thread thread_hot(HotTest);

    thread_server.join();
    thread_hot.join();
    return 0;
}
